#include "gptim.h"
uint16_t timer_count=0;
uint32_t load_num=0;
/****************************************************************************
 * @brief       初始化通用定时器
 * @param       counts: 计数值
 * @param       resolution: 定时器周期，resolution = 1s = 1000000μs（此处，定时器以微秒作为计算单位，）
 * @retval      无
 *****************************************************************************/
void gptim_int_init(uint16_t counts, uint32_t  resolution)
{
    uint64_t count;
    
    /* 创建通用定时器句柄 */
    gptimer_handle_t g_tim = NULL;
    /* 配置通用定时器 */
    gptimer_config_t g_tim_handle={
        .clk_src = GPTIMER_CLK_SRC_DEFAULT,                                    /* 选择定时器时钟源 */
        .direction = GPTIMER_COUNT_UP,                                         /* 递增计数模式 */         
        .resolution_hz = resolution                                           /* 计数频率,定时器时基 */
    };
    /* 注册用户回调函数 ,报警后会触发中断*/ 
    gptimer_event_callbacks_t g_tim_callbacks={
                    .on_alarm = gptimer_callback
    };
    # if IS_ATUO_LOAD
    /*设置自动加载模式时，要设置重载值 */    
    gptimer_alarm_config_t alarm_config={
            .alarm_count    = 1000000,                                               /* 报警目标计数值 */
            .reload_count   = 0,                                                     /* 自动重载值，从该值开始重新计数 */
            .flags.auto_reload_on_alarm = true                                       /* 自动重载功能使能 */
    };
    #else
    gptimer_alarm_config_t alarm_config={
        .alarm_count    = 1000000,                                                   /* 报警目标计数值 */
    };
    #endif
    ESP_ERROR_CHECK(gptimer_new_timer(&g_tim_handle, &g_tim));                          /* 创建新的通用定时器，并返回句柄g_tim */

    /* 设置和获取计数值 */
    ESP_LOGI("GPTIMER_ALARM", "设置计数值");
    ESP_ERROR_CHECK(gptimer_set_raw_count(g_tim, counts));                              /* 设置计数值 ,即从counts开始累计计数直到alarm_count发生中断*/
    ESP_LOGI("GPTIMER_ALARM", "获取计数值");
    ESP_ERROR_CHECK(gptimer_get_raw_count(g_tim, &count));                              /* 获取计数值 */
    ESP_LOGI("GPTIMER_ALARM", "定时器计数值： %llu", count);

    /* 注册事件回调函数 */  /*报警会触发中断，但中断并不一定是报警触发，还有可能是溢出等原因 */
    ESP_ERROR_CHECK(gptimer_register_event_callbacks(g_tim, &g_tim_callbacks, NULL));  /* 配置通用报警时定时器回调函数 */

    /* 设置报警动作 */
    ESP_LOGI("GPTIMER_ALARM", "使能通用定时器");
    ESP_ERROR_CHECK(gptimer_enable(g_tim));                                             /* 使能通用定时器 */
    ESP_ERROR_CHECK(gptimer_set_alarm_action(g_tim, &alarm_config));                    /* 配置通用定时器报警事件 */
    ESP_ERROR_CHECK(gptimer_start(g_tim));                                              /* 启动通用定时器 */
}

/******************************************************
 * @brief       定时器回调函数
 * @param       无
 * @retval      无
 ******************************************************/
bool IRAM_ATTR gptimer_callback(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_data)
{
    timer_count++;
    if(timer_count>5)
    {
        LED_TOGGLE();
        timer_count=0;
        
    };
    #if !IS_ATUO_LOAD
    if((timer_count%2)==0)
    {
        load_num=1000000;
    }
    else
    {
        load_num=2000000;
    }
    gptimer_alarm_config_t alarm_config = {
                .alarm_count = edata->alarm_value + load_num,  // 动态的调整触发中断的时间
            };
    ESP_ERROR_CHECK(gptimer_set_alarm_action(timer, &alarm_config));
    #endif

    return true;
}


